/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package servlet;

import ejb.BusinessLogicLocal;
import entity.Evento;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Marco
 */
@MultipartConfig
public class ServletEvento extends HttpServlet {
    @EJB
    private BusinessLogicLocal businessLogic;

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @SuppressWarnings("empty-statement")
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        HttpSession session = request.getSession();
        String op = (String) request.getAttribute("Evento");
        int index=0;
        if("inserisci".equals(op)){
            String titoloEvento = request.getParameter("titolo");
            String descrizioneEvento = request.getParameter("descrizione");
            String dataEvento = request.getParameter("datepick2");
            String orario = request.getParameter("orario");
            String prezzoParterreStr = request.getParameter("parterre");
            float prezzoParterre = Float.parseFloat(prezzoParterreStr.trim());
            String prezzoArancioStr = request.getParameter("arancio");
            float prezzoArancio = Float.parseFloat(prezzoArancioStr.trim());
            String prezzoBluStr = request.getParameter("blu");
            float prezzoBlu = Float.valueOf(prezzoBluStr.trim());
            String prezzoRossoStr = request.getParameter("rosso");
            float prezzoRosso = Float.parseFloat(prezzoRossoStr.trim());
            String prezzoVerdeStr = request.getParameter("verde");
            float prezzoVerde = Float.parseFloat(prezzoVerdeStr.trim());
            String prezzoGialloStr = request.getParameter("giallo");
            float prezzoGiallo = Float.parseFloat(prezzoGialloStr.trim()); 
            String locandina = request.getParameter("locandina");
            String result = businessLogic.insertEvento(titoloEvento, descrizioneEvento, dataEvento, orario, prezzoParterre, prezzoArancio, prezzoBlu, prezzoRosso, prezzoVerde, prezzoGiallo, locandina);
            try (PrintWriter out = response.getWriter()) {
                /* TODO output your page here. You may use following sample code. */
                if(result.equals("InserimentoEffettuato")){
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/gest_evento.jsp?op=inserimentoEffettuato");
                    rd.forward(request, response);
                }
                else{
                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/gest_evento.jsp?op=inserimentoNonEffettuato");
                    rd.forward(request, response);
                }
            }
        } else if(op.equals("visualizzaEventi")){
            List<Evento> eventi = businessLogic.findAllEvent();
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/gest_evento.jsp?op=visualizzaEventi");
            request.setAttribute("listaeventi", eventi);
            rd.forward(request, response);
            
        }else if(op.equals("visualizzaEvento")){
            String idEvento = request.getParameter("idevento");
            Evento evento = businessLogic.findEventbyId(Long.decode(idEvento));
            int postiparterre = businessLogic.contaPostiLiberi(Long.decode(idEvento), "parterre");
            int postiarancio1 = businessLogic.contaPostiLiberi(Long.decode(idEvento), "arancio1");
            int postiarancio2 = businessLogic.contaPostiLiberi(Long.decode(idEvento), "arancio2");
            int postiblu1 = businessLogic.contaPostiLiberi(Long.decode(idEvento), "blu1");
            int postiblu2 = businessLogic.contaPostiLiberi(Long.decode(idEvento), "blu2");
            int postiverde = businessLogic.contaPostiLiberi(Long.decode(idEvento), "verde");
            int postigiallo = businessLogic.contaPostiLiberi(Long.decode(idEvento), "giallo");
            int postirosso1 = businessLogic.contaPostiLiberi(Long.decode(idEvento), "rosso1");
            int postirosso2 = businessLogic.contaPostiLiberi(Long.decode(idEvento), "rosso2");
            request.setAttribute("Evento", "visualizzaEvento");
            request.setAttribute("dettaglievento", evento);
            request.setAttribute("parterre", postiparterre);
            request.setAttribute("arancio1", postiarancio1);
            request.setAttribute("arancio2", postiarancio2);
            request.setAttribute("blu1", postiblu1);
            request.setAttribute("blu2", postiblu2);
            request.setAttribute("verde", postiverde);
            request.setAttribute("giallo", postigiallo);
            request.setAttribute("rosso1", postirosso1);
            request.setAttribute("rosso2", postirosso2);
            RequestDispatcher visualizzaSingoloEvento = getServletContext().getRequestDispatcher("/gest_evento.jsp?op=visualizzaEvento");
            visualizzaSingoloEvento.forward(request, response);
        }
        else if(op.equals("cancellaSingoloEvento")){
            String idEvento = request.getParameter("idevento");
            boolean result = businessLogic.cancellaEvento(Long.decode(idEvento));
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/gest_evento.jsp?op=cancellaSingoloEvento");
            request.setAttribute("result", result);   
            rd.forward(request, response);               
        }
        else if(op.equals("modificaSingoloEvento")){
            String idEvento = request.getParameter("idevento");
            Evento evento = businessLogic.findEventbyId(Long.decode(idEvento));
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/gest_evento.jsp?op=modificaSingoloEvento");
            request.setAttribute("modificaEvento", "singoloEvento");
            request.setAttribute("idevento", evento.getId());
            request.setAttribute("titoloevento", evento.getTitoloEvento());
            request.setAttribute("descrizioneevento", evento.getDescrizioneEvento());            
            request.setAttribute("locandinaevento", evento.getLocandina());
            DateFormat df = new SimpleDateFormat("yyy-MM-dd");  
            String data = df.format(evento.getDataEvento());
            request.setAttribute("dataevento", data);
            request.setAttribute("orari", evento.getOrari());
            request.setAttribute("prezzoarancio", evento.getPrezzoArancio());            
            request.setAttribute("prezzoblu", evento.getPrezzoBlu());            
            request.setAttribute("prezzogiallo", evento.getPrezzoGiallo());            
            request.setAttribute("prezzoparterre", evento.getPrezzoParterre());            
            request.setAttribute("prezzorosso", evento.getPrezzoRosso());            
            request.setAttribute("prezzoverde", evento.getPrezzoVerde());   
            rd.forward(request, response);           
        }
        else if(op.equals("updateEvento")){
            String idEvento = request.getParameter("idevento");
            String titolo = (String) request.getParameter("titoloev");
            String data = (String) request.getParameter("dataev");
            String ora = (String) request.getParameter("oraev");
            String descrizione = (String) request.getParameter("descrizioneev");
            String prezzoParterreStr = request.getParameter("prezzoparterre");
            float prezzoParterre = Float.parseFloat(prezzoParterreStr.trim());
            String prezzoArancioStr = request.getParameter("prezzoarancio");
            float prezzoArancio = Float.parseFloat(prezzoArancioStr.trim());
            String prezzoBluStr = request.getParameter("prezzoblu");
            float prezzoBlu = Float.valueOf(prezzoBluStr.trim());
            String prezzoRossoStr = request.getParameter("prezzorosso");
            float prezzoRosso = Float.parseFloat(prezzoRossoStr.trim());
            String prezzoVerdeStr = request.getParameter("prezzoverde");
            float prezzoVerde = Float.parseFloat(prezzoVerdeStr.trim());
            String prezzoGialloStr = request.getParameter("prezzogiallo");
            float prezzoGiallo = Float.parseFloat(prezzoGialloStr.trim());
            
            Date datae = Date.valueOf(data);
            boolean res = businessLogic.updateEvento(Long.decode(idEvento), titolo, descrizione, datae, ora, prezzoParterre, prezzoArancio, prezzoBlu, prezzoRosso, prezzoVerde, prezzoGiallo);
            Evento evento = businessLogic.findEventbyId(Long.decode(idEvento));
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/gest_evento.jsp?op=updateEvento");
            request.setAttribute("result", res);
            request.setAttribute("dettaglievento", evento);
            rd.forward(request, response);    
            
        }else if(op.equals("prenotaEvento")){
            String postiSelezionati = request.getParameter("postiselezionati");
            String settore = request.getParameter("settore");
            String idEvento = request.getParameter("evento");
            String[] posto = postiSelezionati.split(";");
            List<Boolean> conferma = new LinkedList<Boolean>();
            Long idUtente = businessLogic.getIdUtente((String)session.getAttribute("nomeUtente"));
            java.util.Date d = new java.util.Date();
            Long idPreno = businessLogic.creaPrenotazione(idUtente, Long.parseLong(idEvento), new Date(d.getTime()));
            float costo = businessLogic.getCosto(Long.parseLong(idEvento), settore);
            float costoTotale = 0.0F;
            for(int i=0; i<posto.length; i++){
                String[] dettagliPosto = posto[i].split("-");
                String numero = dettagliPosto[0];
                String fila = dettagliPosto[1];
                Long idPosto = businessLogic.trovaPosto(Integer.decode(numero), fila.toLowerCase(), settore);
                costoTotale+=costo;
                boolean result = businessLogic.prenotaPosto(idPosto, idPreno, costo);
                if(result){
                    conferma.add(true);
                }
                else{
                    conferma.add(false);
                }
            }
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/acquistoEvento.jsp");
            if(conferma.contains(false)){              
                request.setAttribute("acquistoEvento", "errore");      
            }
            else{
                request.setAttribute("posti", postiSelezionati);
                request.setAttribute("idevento", idEvento);
                request.setAttribute("settore", settore);
                request.setAttribute("postiTotali", posto.length);
                request.setAttribute("costo", costoTotale);
                request.setAttribute("acquistoEvento", "successo");
            }
            rd.forward(request, response);
        }else if(op.equals("bigliettoevento")){
                        
            
            String idEvento = request.getParameter("idevento");           
            Evento e = businessLogic.findEventbyId(Long.decode(idEvento));
            
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/acquistoEvento.jsp");            
            request.setAttribute("titoloevento", e.getTitoloEvento());
            request.setAttribute("dataevento", e.getDataEvento().toString());
            request.setAttribute("oraevento", e.getOrari());
            request.setAttribute("locandina", e.getLocandina());
            request.setAttribute("acquistoEvento", "completato");    
            
            String settore = (String) request.getParameter("settore");
            String posti = (String) request.getParameter("posti");
            String[] d = e.getDataEvento().toString().split("-");
            String data = d[2] + "-" + d[1] + "-" + d[0];
            String modalita = (String) request.getParameter("modalita");
            String nomecognome = "";
            if (modalita.equals("mastercard")) {
                nomecognome = (String) request.getParameter("nomecognomemc");
            } else if (modalita.equals("visa")) {
                nomecognome = (String) request.getParameter("nomecognomevisa");
            } else if (modalita.equals("paypal")) {
                nomecognome = (String) request.getParameter("nomecognomepp");
            } else {
                nomecognome = (String) request.getParameter("nomecontrassegno");
            }
            String messaggio = "Salve " + (String) session.getAttribute("nomeUtente") + ",<br> desideriamo informarti che la prenotazione per l’evento: " + e.getTitoloEvento() + ", in data: " + data + " " + e.getOrari() + " dei posti: " + "(" + settore + ")" + posti + " è andata a buon fine.<br><br>Cordiali Saluti,<br>mfn-centrosportivo";
            messaggio += "<div style=\"position: absolute;margin-left: -255px;width: 745px;height: 380px;background-image: url('cid:image_biglietto');background-repeat: no-repeat;\">\n"
                    + "                                                <div style=\"width: 150px;height: 150px;margin-top: 75px;margin-left: 80px;float: left;text-align: left;\">\n"
                    + "                                                    <img src=\"cid:image_locandina\" width=\"150px\" height=\"150px;\">\n"
                    + "                                                </div>\n"
                    + "                                                <div style=\"width: 300px;height: 80px;margin-top: 60px;margin-left: 30px;float: left;text-align: left;\">\n"
                    + "                                                    <h1>" + e.getTitoloEvento() + "</h1>    \n"
                    + "                                                </div>\n"
                    + "                                                <div style=\"width: 200px;height: 50px;margin-top: -20px;float: left;margin-left: 30px;text-align: left;\">\n"
                    + "                                                    <h4><u>Data:</u>&nbsp;&nbsp;&nbsp;" + data + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n"
                    + "                                                        <u>Ora:</u>&nbsp;&nbsp;&nbsp;" + e.getOrari() + "\n"
                    + "                                                    </h4>\n"
                    + "                                                </div>\n"
                    + "                                                <div style=\"width: 200px;min-height: 50px;margin-top: 30px;margin-left: -100px;float: left;text-align: left;\">\n"
                    + "                                                    <h4><u>Posti:</u>&nbsp;&nbsp;&nbsp;" + posti + "</h4>\n"
                    + "                                                </div>\n"
                    + "                                                <div style=\"width: 100px;height: 100px;float: left;text-align: left;margin-top: 20px;margin-left: -200px;\">\n"
                    + "                                                    <h4><u>Intestatario:</u>&nbsp;&nbsp;&nbsp;"+nomecognome+"</h4>\n"
                    + "                                                </div>\n"
                    + "                                            </div>";
            Path webAppPath = Paths.get(getServletContext().getRealPath("/"));
            Path root = webAppPath.getRoot();
            String subPath = root.toString().concat((webAppPath.subpath(0, webAppPath.getNameCount() - 4)).toString());
            businessLogic.sendMail((String) session.getAttribute("nomeUtente"), "Evento prenotato: " + e.getTitoloEvento(), messaggio, subPath + "/mfm-centro-sportivo-war/web/Images/biglietto.jpg", subPath + "/mfm-centro-sportivo-war/web/" + e.getLocandina());            
            rd.forward(request, response); 
        }
    }
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
